<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        /*
            let声明：和var声明类似，相当于声明变量，但是let只在块作用域中有效，相当于提供了块作用域
            特点：
                1.声明的变量符合块作用域
                2.不可以重复声明
                3.块作用域也可以随意嵌套,也有作用域链
                4.没有声明提升


        */
    //    {
    //        let a= 1;
        
    //    }
    //    console.log(a);//报错
        // {
        //     let a = 3;
        //     let a = 4;
        //     console.log(a);//Identifier 'a' has already been declared
        // }
            // {
            //     let a = 1;
            //     {
            //         let c = 2;
            //         console.log(a);//1
            //     }
            // }
        //     {
        //         console.log(a);//报错
        //         console.log(fn);//报错
        //         let a = 1;
        //         function fn(){
        //             console.log(1);
        //     }
        // }
        //方法一：闭包隔离作用域
        //每一次循环给函数传参，i只要找不到小括号里面的i就不可能一直是5，而给函数传参，每一次都给他传的值不一样，在作用域里面可以找到i就不用往外面找
        for(var i = 0; i < 5; i++){
            (function(i){
                setTimeout(function(){
                console.log(i);
            })
            })(i)
        }
        
        //方法二：let隔离作用域 隔离了小括号里面的i，也是形成了闭包
        for(let i = 0; i < 5; i++){
            setTimeout(function(){
                console.log(i);
            })
        }
    </script>
</body>
</html>